public class Singleton {
    /**
     * 构造方法私有化 不能new 对象出来
     */
    private Singleton() {}

    /**
     * 懒汉模式
     *  只有第一次用到该对象时才会实例化
     *  懒汉模式在多线程中可能会引起异常错误
     */
    // 通过添加synchronized关键字，即使在多线程环境中，该代码也能正常运行 但是如果多次调用此方法会影响性能
    // private static Singleton singleton = null;
    /*public static synchronized Singleton getInstance() {
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }*/
    // volatile 关键字确保 当singleton变量被初始化成Singleton实例时，多个线程正确的处理singleton变量
    private volatile static Singleton singleton;
    public static Singleton getInstance() {
        // 检查实例 如果不存在 就进入同步区块
        if (singleton == null) {
            // 注意 只有第一次才会彻底执行这里的代码
            synchronized (Singleton.class) {
                // 进入区块后 再检查一次 如果仍是null 才创建实例
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }

    /**
     * 饿汉模式
     *  一开始就实例化对象出来
     */
    /*
    private static Singleton singleton = new Singleton();
    public static Singleton getInstance() {
        return singleton;
    }
    */
}
